symlink関数は、既存ファイルやディレクトリに対して、別名(シンボリック・リンク)を作成します。

リンクにはハード・リンクとシンボリック・リンク(又はソフト・リンク)があります。ハード・リンクはファイル・システムを超えて作成できませんし、ディレクトリに対しても作成できません。これに対して、シンボリック・リンクにはこれらの制限はありません。ハード・リンクに付いてはlink関数をご覧ください。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <unistd.h>
int symlink(const char *oldpath, const char *newpath);

*oldpathは既存ファイルやディレクトリをパス名で指定します。
*newpathは別名をパス名で指定します。

戻り値として、処理が成功した場合は0が、エラーの場合は-1を返します。

第1引数の*oldpathを相対パス名で指定する場合は、第2引数の*newpathを起点とした相対パス名になります。

プログラム 例

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
  int     return_code = 0;

  if (argc == 3) {
    /* シンボリック・リンクを作る */
    if (symlink(*(argv + 1), *(argv + 2)) == 0) {
      printf('%sを作成しました\n', *(argv + 2));
    }
    else {
      printf('%sを作成できませんでした\n', *(argv + 2));
      perror('');
      return_code = 1;
    }
  }
  else {
    printf('実行時引数の数が不当です\n');
    return_code = 2;
  }

  return return_code;
}

例の実行結果

$ pwd
/home/user/TMP/WORK
$ ls -ld temp_1.txt DIR1 DIR2
drwxr-xr-x 2 user users 4096 2008-08-11 17:10 DIR1
drwxr-xr-x 2 user users 4096 2008-08-11 17:17 DIR2
-rw-r--r-- 1 user users   20 2008-07-04 09:03 temp_1.txt
$
$ ./symlink.exe $PWD/temp_1.txt DIR2/temp_1_link1.txt
DIR2/temp_1_link1.txtを作成しました
$
$ cd DIR2
$ ../symlink.exe ../temp_1.txt temp_1_link2.txt
temp_1_link2.txtを作成しました
$
$ ../symlink.exe ../DIR1 DIR1_LINK
DIR1_LINKを作成しました
$
$ ls -l
合計 4
lrwxrwxrwx 1 user users  7 2008-08-11 17:38 DIR1_LINK -> ../DIR1
lrwxrwxrwx 1 user users 31 2008-08-11 17:35 temp_1_link1.txt -> /home/user/TMP/WORK/temp_1.txt
lrwxrwxrwx 1 user users 13 2008-08-11 17:36 temp_1_link2.txt -> ../temp_1.txt
-rw-r--r-- 1 user users 75 2008-07-02 11:09 temp_3.txt
$ cat temp_1_link1.txt
Hello World!!.
Bye.
$ ls -l DIR1_LINK
lrwxrwxrwx 1 user users 7 2008-08-11 17:38 DIR1_LINK -> ../DIR1
$ ls -Ll DIR1_LINK
合計 12
-rwxr-xr-x 1 user users 39 2008-07-29 10:13 hello_1.sh
-rw-r--r-- 1 user users 39 2008-07-29 10:43 hello_2.sh
-rw-r--r-- 1 user users 20 2008-07-04 09:03 link_1.txt
$